////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include "BaseObject.hpp"

#include "../Math/QuadTree/QuadTreeNode.hpp"
#include "../Math/QuadTree/QuadTree.hpp"
#include "../Math/BoundingVolumes/BoundingVolumes.h"

#include <SmegTools/Debug/DebugNew.hpp>

namespace smeg {
    namespace core {

////////////////////////////////////////////////////////////
/// Default Constructor
////////////////////////////////////////////////////////////
BaseObject::BaseObject() :
    sf::Transformable(),
    m_pTree( NULL ),
    m_pNode( NULL ),
    m_pBoundingVolume( NULL )
{
}
    
////////////////////////////////////////////////////////////
/// Copy Constructor
////////////////////////////////////////////////////////////
BaseObject::BaseObject( const BaseObject& _Copy ) :
    sf::Transformable( _Copy ),
    m_pTree( _Copy.m_pTree ),
    m_pNode( _Copy.m_pNode ),
    m_pBoundingVolume( NULL )
{
    if ( _Copy.m_pBoundingVolume ) {
        m_pBoundingVolume = _Copy.m_pBoundingVolume->Clone();
    }
}
    
////////////////////////////////////////////////////////////
/// Destructor
////////////////////////////////////////////////////////////
BaseObject::~BaseObject()
{
    delete m_pBoundingVolume;
    RemoveFromQuadTree();
}

////////////////////////////////////////////////////////////
/// If we are in a tree, call its update
////////////////////////////////////////////////////////////
void BaseObject::QuadTreeUpdate() {
    if ( !m_pTree )
        return;

    m_pTree->Update( this );
}

////////////////////////////////////////////////////////////
/// Remove this occupant from the tree
////////////////////////////////////////////////////////////
void BaseObject::RemoveFromQuadTree() {
    if ( !m_pTree )
        return;

    m_pTree->Remove( this );
    m_pTree = NULL;
}

////////////////////////////////////////////////////////////
/// Compute the bounding volume of the object (need to be overriden)
////////////////////////////////////////////////////////////
void BaseObject::ComputeBoundingVolume() { 
    QuadTreeUpdate();
}

/*********************** Accessors ************************/
void BaseObject::setPosition( float _fX, float _fY ) {
    sf::Transformable::setPosition( _fX, _fY );

    if ( m_pBoundingVolume ) {
        m_pBoundingVolume->SetCenter( _fX, _fY );
    }
    QuadTreeUpdate();
}

void BaseObject::move( float _fX, float _fY ) {
    sf::Transformable::move( _fX, _fY );

    if ( m_pBoundingVolume ) {
        m_pBoundingVolume->MoveCenter( _fX, _fY );
    }
    QuadTreeUpdate();
}

#ifdef _DEBUG
void BaseObject::DebugRender( sf::RenderWindow* _pRenderWindow, const sf::Color& _Color ) const {
    if ( m_pBoundingVolume ) {
        m_pBoundingVolume->DebugRender( _pRenderWindow, _Color );
    }
}
#endif // _DEBUG

    } // namespace core
} // namespace smeg